home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DTP
/
DTP_TEX
/
3239.ZIP
/
DVIMTP.ZIP
/
OPTION.H
< prev
next >
Wrap
C/C++ Source or Header
|
1987-11-14
|
8KB
|
338 lines
/* -*-C-*- option.h */
/*-->option*/
/**********************************************************************/
/******************************* option *******************************/
/**********************************************************************/
void
option(optstr) /* process command-line option */
char *optstr; /* option string (e.g. "-m1500") */
{
register UNSIGN32 k; /* magnification */
register int value; /* converted digit string value */
register int m; /* loop index */
char *p; /* pointer into optstr */
int p1,p2,p3; /* temp values for sscanf() */
double fltmag; /* floating-point mag value */
typedef struct
{
char* envname;
char* envvar;
} envstruct;
static envstruct envlist[] =
{ /* names and addresses of environment vars (alphabetical order) */
"DVIHELP", helpcmd,
"FONTLIST", fontlist,
"TEXFONTS", fontpath,
"TEXINPUTS", subpath,
};
if (*optstr != '-')
return; /* return if this is not an option */
switch (*(optstr+1))
{
case 'a': /* A selects virtual font caching */
case 'A':
#if VIRTUAL_FONTS
virt_font = TRUE;
#endif
break;
case 'b': /* b selects backwards printing order */
case 'B':
backwards = TRUE;
break;
case 'c': /* c selects number of copies */
case 'C':
copies = (UNSIGN16) atoi(optstr+2);
copies = MAX(1,MIN(copies,256)); /* enforce reasonable limits */
break;
case 'd': /* d selects debug output */
case 'D':
debug_code |= (BYTE)atoi(optstr+2);
break;
case 'e': /* e specifies ``environment'' variable definition */
case 'E': /* We ignore letter case since these come from */
/* the command line */
if (!(p = strrchr(optstr,'=')))
{
(void)usage(stderr);
(void)sprintf(message,
"option(): Bad switch [%s]--expected -eENVNAME=value",
optstr);
(void)fatal(message);
}
*p = '\0'; /* clobber "=" by string terminator */
for (m = 0; m < sizeof(envlist)/sizeof(envlist[0]); ++m)
{
if (strcm2(optstr+2,envlist[m].envname) == 0)
{
(void)strcpy(envlist[m].envvar,p+1);
return;
}
}
(void)usage(stderr);
(void)sprintf(message,"option(): Bad switch [%s]--expected one of:",
optstr);
for (m = 0; m < sizeof(envlist)/sizeof(envlist[0]); ++m)
{
(void)strcat(message," ");
(void)strcat(message,envlist[m].envname);
}
(void)fatal(message);
break;
case 'f': /* f specifies font substitution file */
case 'F':
(void)strcpy(subfile,optstr+2);
break;
#if CANON_A2
#ifdef CANON_TEST
case 'g':
case 'G':
stor_fonts = (UNSIGN32)atoi(optstr + 2 );
break;
#endif /* CANON_TEST */
#endif
case 'l': /* l prohibits logging of errors */
case 'L':
g_dolog = FALSE;
break;
case 'm': /* m selects alternate magnification */
case 'M':
/* Collect 2*value initially. Then if value is small, assume
user specified magstep value; magstep k means 1.2**k, where k
is integral, or half-integral. Otherwise, assume user has
specified pxl file magnification (1000 == 200dpi, 1500 ==
300dpi, etc.). */
if (strchr(optstr+2,'.') != (char *)NULL)
fltmag = (double)(2.0 * atof(optstr+2));
else
fltmag = (double)(2 * atoi(optstr+2));
if ((0.0 != fltmag) &&
(-30.0 <= fltmag) && (fltmag <= 30.0)) /* magstep 15 is limit */
{
if (fltmag < 0.0)
runmag = (UNSIGN32)(0.5 +
(1.0/pow((double)sqrt(1.2),-fltmag))*(double)STDMAG);
else
runmag = (UNSIGN32)(0.5 + pow((double)sqrt(1.2),fltmag)*
(double)STDMAG);
}
else
runmag = (UNSIGN32)(0.5 + fltmag/2.0);
k = MAGSIZE(actfact(runmag)); /* rounded magnification */
if (k != runmag)
{
(void)sprintf(message,
"option(): Requested magnification %d not available.",
(int)runmag);
(void)warning(message);
runmag = k;
k = (UNSIGN32) MAX(1,MIN(mag_index,(MAGTABSIZE-1)));
(void)sprintf(message,
" Magnification reset to nearest legal value %d in \
family ..%d..%d..%d..",
(int)runmag,(int)MAGSIZE(mag_table[k-1]),
(int)MAGSIZE(mag_table[k]),
(int)MAGSIZE(mag_table[k+1]));
(void)warning(message);
}
break;
case 'o':
case 'O': /* o selects output page range (-o# or -o#:# or -o#:#:#) */
p1 = p2 = p3 = 0;
value = (int)sscanf(optstr+2,"%d:%d:%d",&p1,&p2,&p3);
page_begin[npage] = p1;
page_end[npage] = p2;
page_step[npage] = p3;
switch (value)
{
case 1:
optstr++; /* point past "-" */
do /* skip over digit string */
{
optstr++;
}
while (isdigit(*optstr) || (*optstr == '-') || (*optstr == '+'));
if (*optstr) /* trash follows number */
{
(void)usage(stderr);
(void)sprintf(message,
"option(): %s is not a legal page number switch",optstr);
(void)fatal(message);
}
else /* had expected end-of-string */
page_end[npage] = (INT16)page_begin[npage];
page_step[npage] = 1;
break;
case 2: /* supply default step */
page_step[npage] = 1;
/* FALL THROUGH to case 3 for order check */
case 3: /* check for positive step */
page_step[npage] = ABS(page_step[npage]);
if (page_step[npage] == 0)
page_step[npage] = 1;
break;
default: /* illegal value */
(void)usage(stderr);
(void)sprintf(message,
"option(): %s is not a legal page number switch",optstr);
(void)fatal(message);
}
npage++;
break;
case 'p': /* p prohibits pre-font loading */
case 'P':
#if (HPLASERJET|HPJETPLUS|GOLDENDAWNGL100|POSTSCRIPT|IMPRESS|CANON_A2)
preload = TRUE; /* preloading required for Canon engines */
/* because of reverse printing order */
#else
preload = FALSE;
#endif /*NOT(HPLASERJET|HPJETPLUS|GOLDENDAWNGL100|POSTSCRIPT|IMPRESS|CANON_A2)*/
break;
case 'q': /* q inhibits status display */
case 'Q':
quiet = TRUE;
break;
#if HPLASERJET
case 'r': /* r selects output resolution */
case 'R':
hpres = (INT16)atoi(optstr+2);
if ((hpres != 75) && (hpres != 100) && (hpres != 150) &&
(hpres != 300))
{
(void)sprintf(message,
"option(): Output resolution not in [75,100,150,300] dpi; \
reset to %d",
DEFAULT_RESOLUTION);
(void)warning(message);
hpres = DEFAULT_RESOLUTION;
}
break;
#endif /* HPLASERJET */
#if (APPLEIMAGEWRITER | EPSON | GOLDENDAWNGL100 | TOSHIBAP1351)
case 'r': /* r selects run-length coding of output */
case 'R':
runlengthcode = TRUE;
break;
#endif /* (APPLEIMAGEWRITER | EPSON | GOLDENDAWNGL100 | TOSHIBAP1351) */
#if CANON_A2
#ifdef CANON_TEST
case 's': /* pixel size limit to force character reloading */
case 'S':
size_limit = (UNSIGN16)atoi(optstr+2);
break;
#endif /* CANON_TEST */
#endif /* CANON_A2 */
#if POSTSCRIPT
case 's': /* pixel size limit to force character reloading */
case 'S':
size_limit = (UNSIGN16)atoi(optstr+2);
break;
#endif
#if EPSON
case 't':
case 'T':
#if HIRES
twice_a_line = TRUE;
#endif /* HIRES */
break;
#endif /* EPSON */
#if CANON_A2
#ifdef CANON_TEST
case 'u':
case 'U':
merit_fact = (UNSIGN16)atoi(optstr+2);
break;
case 'v':
case 'V':
stor_limit = (UNSIGN32)atoi(optstr+2);
break;
#endif /* CANON_TEST */
#endif /* CANON_A2 */
#if POSTSCRIPT
case 'v': /* vmbug -- reload fonts on each page */
case 'V':
ps_vmbug = TRUE;
break;
#endif /* POSTSCRIPT */
case 'x':
case 'X':
leftmargin = inch(optstr+2);
break;
case 'y':
case 'Y':
topmargin = inch(optstr+2);
break;
#if (OS_TOPS20 | BSD42)
case 'z':
case 'Z':
spool_output = TRUE; /* offer to send output to spooler */
break;
#endif /* (OS_TOPS20 | BSD42) */
default:
(void)usage(stderr);
(void)sprintf(message,"option(): %s is not a legal switch", optstr);
(void)fatal(message);
}
}